package com.mzy.linear_struct.subject;

/**
 * @Author: codermzy
 * @Date: 2024/04/25/下午8:52
 * @Description:
 */
public class 两个线程交替打印奇偶数 {
    // public static final Object lock = new Object();
    // public static boolean printOdd = false;

    // public static void main(String[] args) {
    //     Thread t1 = new Thread(() -> {
    //         for (int i = 1; i <= 100; i++) {
    //             try {
    //                 synchronized (lock) {
    //                     if (i % 2 == 0) {
    //
    //                         while (!printOdd) {
    //                             lock.wait();
    //                         }
    //                         System.out.println(i);
    //                         printOdd = false;
    //                         lock.notify();
    //                     }
    //                 }
    //             } catch (Exception e) {
    //                 e.printStackTrace();
    //             }
    //         }
    //     });
    //
    //     Thread t2 = new Thread(() -> {
    //         for (int i = 1; i <= 100; i++) {
    //             try {
    //                 synchronized (lock) {
    //                     if (i % 2 != 0) {
    //                         while (printOdd) {
    //                             lock.wait();
    //                         }
    //                         System.out.println(i);
    //                         printOdd = true;
    //                         lock.notify();
    //                     }
    //                 }
    //             } catch (Exception e) {
    //                 e.printStackTrace();
    //             }
    //         }
    //     });
    //
    //     t1.start();
    //     t2.start();
    // }

    // static int num = 1;

    public static final Object lock = new Object();
    public static boolean isOdd = false;


    static int num = 0;

    public static void main(String[] args) {

        // Thread t1 = new Thread(() -> {
        //     while (num <= 100) {
        //         try {
        //             synchronized (lock) {
        //                 if (num % 2 == 1) {
        //                     System.out.println(num);
        //                     num++;
        //                     lock.notify();
        //                 } else {
        //                     lock.wait();
        //                 }
        //             }
        //         } catch (Exception e) {
        //             e.printStackTrace();
        //         }
        //     }
        // });
        //
        // Thread t2 = new Thread(() -> {
        //
        //     try {
        //         while (num <= 100) {
        //             synchronized (lock) {
        //                 if (num % 2 == 0) {
        //                     System.out.println(num);
        //                     num++;
        //                     lock.notify();
        //                 } else {
        //                     lock.wait();
        //                 }
        //             }
        //         }
        //     } catch (Exception e) {
        //         e.printStackTrace();
        //     }
        // });


        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                for (int num = 1; num <= 100; num++) {
                    try {
                        while (!isOdd) {
                            lock.wait();
                        }
                        if (num % 2 == 0) {
                            System.out.println(num);
                        }
                        isOdd = false;
                        lock.notifyAll();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }

                }
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (lock) {
                for (int num = 1; num <= 100; num++) {
                    try {
                        while (isOdd) {
                            lock.wait();
                        }
                        if (num % 2 == 1) {
                            System.out.println(num);
                        }
                        isOdd = true;
                        lock.notifyAll();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        });
        t1.start();
        t2.start();
    }
}
